<?php
 /**
 *  +---------------------------------------------------------------------- 
 *  | 文件功能：API路由权限验证中间件
 *  +---------------------------------------------------------------------- 
 *  | Copyright (c) 2022~2024 https://www.huihuiv.com All rights reserved.
 *  +---------------------------------------------------------------------- 
 *  | Create At: 2024年02月26日 18:08:00
 *  +---------------------------------------------------------------------- 
 *  | Author: 半壶水 <star@cqshanwen.com>
 *  +---------------------------------------------------------------------- 
 */

namespace App\Http\Middleware;

use App\Librarys\Message;
use App\Models\AuthModel;
use App\Models\GroupModel;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;

class AuthMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        // 获取当前登录用户信息
        $user = Auth::guard('api')->user();
        // 判断是否有效登录
        if(empty($user)) {
            // 登录失效或未登录
            return Message::show(false, '您暂未登录或者登录令牌已过期', [], 401);
        }

        // 实例化用户组模型
        $group = new GroupModel();
        // 获取用户的用户组信息
        $userGroupInfo = $group->where(['gid' => $user->gid])->first();
        // 判断用户组是否合法
        if(empty($userGroupInfo)) {
            // 用户组非法
            return Message::show(false, '非法请求');
        }
        // 获取用户组权限列表
        $userAuthRights = $userGroupInfo->rights;
        // 序列化用户权限列表
        $userAuthRights = json_decode($userAuthRights, true);

        // 获取当前访问的api路由信息
        $tmpRoute = $request->route()->action['controller'];
        // 分割数据
        $tmpRoute = explode('\\', $tmpRoute);
        // 二次分割
        $route = explode('@', $tmpRoute[count($tmpRoute) - 1]);
        
        // 实例化权限菜单模型
        $auth = new AuthModel();
        // 获取当前api路由信息
        $authInfo = $auth->where(['controller' => $route[0], 'action' => $route[1]])->first();
        // 判断api路由信息是否有效
        if(empty($authInfo)){
            // api路由信息无效
            return Message::show(false, '当前访问节点不存在');
        } 
        
        // 判断路由状态是否正常
        if($authInfo->status == 1) {
            return Message::show(false, '当前节点已被禁用，暂无访问权限');
        }
        
        // 判断用户是否有权限访问当前路由
        if(!in_array($authInfo->auth_id, $userAuthRights)) {
            return Message::show(false, '你没有访问当前节点权限');
        }


        return $next($request);
    }
}
